Vue.use = function (plugin: Function | Object) {
    // installedPlugins为已安装插件列表，若Vue构造函数不存在installedPlugins属性,初始化
    const installedPlugins = (this._installedPlugins|| (this._installedPlugins = []))
    // 判断当前插件是否在已安装插件列表，若存在则直接返回，避免重复安装
    if(installedPlugins.indexOf(plugin) > -1) {
        return this
    }

    // toArray 方法将Use方法的参数转为组件并删除了第一个参数（第一个参数就是我们的插件）
    const args = toArray(arguments, 1)
    // use是构造函数vue的静态方法，那这里的this就是构造函数vue本身
    // 把this即构造函数vue放到参数数组args的第一项
    args.unshift(this)
    if(typeof plugin.install === 'function') {
        // 传入参数存在install属性且为函数
        //  将构造函数vue和剩余数组组成的args数组作为参数传入install方法，将其this指向插件对象并执行install方法
        plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
        // 传入参数是个函数
        // 将构造函数vue和剩余参数组成的args数组作为参数传入插件函数并执行
        plugin.apply(null, args)
    }
    // 向已安装插件列表中push当前插件
    installedPlugins.push(plugin)
    return this
}